home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifgate / mkftnhdr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-04  |  7.5 KB  |  357 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <limits.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <time.h>
  7. #include "xutil.h"
  8. #include "lutil.h"
  9. #include "ftn.h"
  10. #include "ftnmsg.h"
  11. #include "rfcmsg.h"
  12. #include "config.h"
  13.  
  14. #ifndef ULONG_MAX
  15. #define ULONG_MAX 4294967295
  16. #endif
  17.  
  18. int newsmode=0;
  19. extern char *version;
  20.  
  21. extern faddr *bestaka;
  22.  
  23. extern time_t parsedate(char *,void *);
  24. extern void registrate(char *,char *);
  25. extern unsigned long atoul(char*);
  26.  
  27. extern unsigned long sequencer(void);
  28. extern unsigned long crc(char *);
  29.  
  30. static char *flnm[] = {
  31.     "PVT","CRS","RCV","SNT","ATT","TRN","ORP","K/S",
  32.     "LOC","HLD","RSV","FRQ","RRQ","RRC","ARQ","FUP"
  33. };
  34.  
  35. void setflags(tmsg,s)
  36. ftnmsg *tmsg;
  37. char *s;
  38. {
  39.     char *buf,*p;
  40.     int i;
  41.  
  42.     buf=xstrcpy(s);
  43.     p=strtok(buf," ,\t\n");
  44.     while (p)
  45.     {
  46.         for (i=0;i<16;i++)
  47.             if (!strcasecmp(p,flnm[i]))
  48.                 tmsg->flags |= (1 << i);
  49.         p=strtok(NULL," ,\t\n");
  50.     }
  51.     free(buf);
  52. }
  53.  
  54. char *months[] = {
  55. "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
  56. };
  57.  
  58. char *ftndate(t)
  59. time_t t;
  60. {
  61.     static char buf[32];
  62.     struct tm *ptm;
  63.  
  64.     ptm=localtime(&t);
  65.     sprintf(buf,"%2d %s %2d  %02d:%02d:%02d",ptm->tm_mday,
  66.         months[ptm->tm_mon],ptm->tm_year%100,
  67.         ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
  68.     return xstrcpy(buf);
  69. }
  70.  
  71. char *ftnmsgid(msgid)
  72. char *msgid;
  73. {
  74.     char *buf,*l,*r;
  75.     unsigned long nid;
  76.     faddr *tmp;
  77.  
  78.     if (msgid)
  79.     {
  80.         buf=xmalloc(strlen(msgid)+65);
  81.         strcpy(buf,msgid);
  82.         if ((l=strchr(buf,'<'))) l++;
  83.         else l=buf;
  84.         while (isspace(*l)) l++;
  85.         if ((r=strchr(l,'>'))) *r='\0';
  86.         if (*(r=l+strlen(l)-1) == '\n') *r='\0';
  87.         if ((tmp=parsefaddr(l)))
  88.         {
  89.             if (strspn(tmp->name,"0123456789") == strlen(tmp->name))
  90.                 nid=atoul(tmp->name);
  91.             else nid=ULONG_MAX;
  92.             if (nid == ULONG_MAX) nid=crc(tmp->name);
  93.             sprintf(buf,"%s %08lx",ascfnode(tmp,0x1f),nid);
  94.             tidy_faddr(tmp);
  95.             r=xstrcpy(buf);
  96.         }
  97.         else
  98.         {
  99.             if ((r=strchr(l,'@')) == NULL)
  100.             {
  101.                 sprintf(buf,"%s %08lx",
  102.                     ascfnode(bestaka,0x1f),
  103.                     crc(l));
  104.                 r=xstrcpy(buf);
  105.             }
  106.             else
  107.             {
  108.                 *r++='\0';
  109.                 if (strspn(l,"0123456789") == strlen(l))
  110.                     nid=atoul(l);
  111.                 else nid=ULONG_MAX;
  112.                 if (nid == ULONG_MAX) nid=crc(l);
  113.                 sprintf(r+strlen(r)," %08lx",nid);
  114.                 r=xstrcpy(r);
  115.             }
  116.         }
  117.     }
  118.     else
  119.     {
  120.         buf=xmalloc(64); /* is it really enough for normal msgid ?*/
  121.         sprintf(buf,"%s %08lx",ascfnode(bestaka,0x1f),
  122.             sequencer());
  123.         r=xstrcpy(buf);
  124.     }
  125.  
  126.     free(buf);
  127.     return r;
  128. }
  129.  
  130. void tidy_ftnmsg(tmsg)
  131. ftnmsg *tmsg;
  132. {
  133.     if (tmsg == NULL) return;
  134.  
  135.     tmsg->flags=0;
  136.     if (tmsg->to) tidy_faddr(tmsg->to); tmsg->to=NULL;
  137.     if (tmsg->from) tidy_faddr(tmsg->from); tmsg->from=NULL;
  138.     if (tmsg->date) free(tmsg->date); tmsg->date=NULL;
  139.     if (tmsg->subj) free(tmsg->subj); tmsg->subj=NULL;
  140.     if (tmsg->msgid) free(tmsg->msgid); tmsg->msgid=NULL;
  141.     if (tmsg->reply) free(tmsg->reply); tmsg->reply=NULL;
  142.     if (tmsg->origin) free(tmsg->origin); tmsg->origin=NULL;
  143.     if (tmsg->area) free(tmsg->area); tmsg->area=NULL;
  144.     free(tmsg);
  145. }
  146.  
  147. ftnmsg *mkftnhdr(msg)
  148. rfcmsg *msg;
  149. {
  150.     char *freename,*rfcfrom,*p,*l,*r;
  151.     char *fbuf=NULL;
  152.     ftnmsg *tmsg;
  153.  
  154.     tmsg=(ftnmsg *)xmalloc(sizeof(ftnmsg));
  155.  
  156.     tmsg->flags=0;
  157.     tmsg->to=NULL;
  158.     tmsg->from=NULL;
  159.     tmsg->date=NULL;
  160.     tmsg->subj=NULL;
  161.     tmsg->msgid=NULL;
  162.     tmsg->reply=NULL;
  163.     tmsg->origin=NULL;
  164.     tmsg->area=NULL;
  165.  
  166.     if (newsmode)
  167.     {
  168.         if ((p=xstrcpy(hdr("Comment-To",msg))) == NULL)
  169.             p=xstrcpy(hdr("X-Comment-To",msg));
  170.         if (p)
  171.         {
  172.             if ((tmsg->to=parsefaddr(p)) == NULL)
  173.             {
  174.                 tmsg->to=parsefaddr("All@p0.f0.n0.z0");
  175.                 if ((l=strrchr(p,'<')) && (r=strchr(p,'>')) && (l < r))
  176.                 {
  177.                     r=l;
  178.                     *r--='\0';
  179.                     while (isspace(*r)) *r--='\0';
  180.                     l=p;
  181.                     while (isspace(*l)) l++;
  182.                 }
  183.                 else if ((l=strrchr(p,'(')) && (r=strchr(p,'>')) && 
  184.                          (l < r))
  185.                 {
  186.                     *r--='\0';
  187.                     while (isspace(*r)) *r--='\0';
  188.                     l++;
  189.                     while (isspace(*l)) l++;
  190.                 }
  191.                 else
  192.                 {
  193.                     l=p;
  194.                     while (isspace(*l)) l++;
  195.                     r=p+strlen(p)-1;
  196.                     if (*r == '\n') *r--='\0';
  197.                     while (isspace(*r)) *r--='\0';
  198.                 }
  199.  
  200.                 if(*l)
  201.                 {
  202.                     free(tmsg->to->name);
  203.                     tmsg->to->name=xstrcpy(l);
  204.                 }
  205.             }
  206.             free(p);
  207.         }
  208.         else
  209.         tmsg->to=parsefaddr("All@p0.f0.n0.z0");
  210.         debug(3,"TO: %s",ascinode(tmsg->to,0x7f));
  211.     }
  212.  
  213.     p=fbuf=xstrcpy(hdr("From",msg));
  214.     if (fbuf == NULL)
  215.     {
  216.         p=fbuf=xstrcpy(hdr("X-UUCP-From",msg));
  217.         if (p) 
  218.         {
  219.             while (isspace(*p)) p++;
  220.             if ((l=strchr(p,' '))) *l='\0'; 
  221.         }
  222.     }
  223.     if (fbuf == NULL) p=fbuf=xstrcpy("Unidentified User <postmaster>");
  224.     if ((l=strchr(p,'<')) && (r=strchr(p,'>')) && (l < r))
  225.     {
  226.         *l++ = '\0';
  227.         *r++ = '\0';
  228.         rfcfrom=l;
  229.         freename=p;
  230.         debug(3,"From address: \"%s\", name: \"%s\" (angle brackets)",
  231.             rfcfrom,freename);
  232.     }
  233.     else if ((l=strchr(p,'(')) && (r=strrchr(p,')')) && (l < r))
  234.     {
  235.         *l++ = '\0';
  236.         *r++ = '\0';
  237.         rfcfrom=p;
  238.         freename=l;
  239.         debug(3,"From address: \"%s\", name: \"%s\" (round brackets)",
  240.             rfcfrom,freename);
  241.     }
  242.     else
  243.     {
  244.         rfcfrom=p;
  245.         freename=p;
  246.         debug(3,"From address: \"%s\", name: \"%s\" (no brackets)",
  247.             rfcfrom,freename);
  248.     }
  249.     if (rfcfrom)
  250.     {
  251.         while (isspace(*rfcfrom)) rfcfrom++;
  252.         p=rfcfrom+strlen(rfcfrom)-1;
  253.         while ((isspace(*p)) || (*p == '\n')) *(p--)='\0';
  254.     }
  255.     if (freename)
  256.     {
  257.         while (isspace(*freename)) freename++;
  258.         p=freename+strlen(freename)-1;
  259.         while ((isspace(*p)) || (*p == '\n')) *(p--)='\0';
  260.         if ((*freename == '\"') && (*(p=freename+strlen(freename)-1) == '\"'))
  261.         {
  262.             freename++;
  263.             *p='\0';
  264.         }
  265.     }
  266.     if (*freename == '\0') freename=rfcfrom;
  267.  
  268.     if (strlen(freename) > MAXNAME) freename[MAXNAME]='\0';
  269.  
  270.     if (newsmode) debug(3,"FROM: %s <%s>",freename,rfcfrom);
  271.     else loginf("from: %s <%s>",freename,rfcfrom);
  272.  
  273.     if ((tmsg->from=parsefaddr(rfcfrom)) == NULL)
  274.     {
  275.         if (freename && rfcfrom)
  276.         if (!strchr(freename,'@') && 
  277.             !strchr(freename,'%') && 
  278.             strncasecmp(freename,rfcfrom,MAXNAME) &&
  279.             strncasecmp(freename,"uucp",4) &&
  280.             strncasecmp(freename,"usenet",6) &&
  281.             strncasecmp(freename,"news",4) &&
  282.             strncasecmp(freename,"super",5) &&
  283.             strncasecmp(freename,"admin",5) &&
  284.             strncasecmp(freename,"system",6)) 
  285.             registrate(freename,rfcfrom);
  286.     }
  287.  
  288.     debug(3,"From address was%s distinguished as ftn",
  289.         tmsg->from ? "" : " not");
  290.  
  291.     if ((tmsg->from == NULL) && (bestaka))
  292.     {
  293.         tmsg->from=(faddr *)xmalloc(sizeof(faddr));
  294.         tmsg->from->name=xstrcpy(freename);
  295.         if (strlen(tmsg->from->name) > MAXNAME)
  296.             tmsg->from->name[MAXNAME]='\0';
  297.         tmsg->from->point=bestaka->point;
  298.         tmsg->from->node=bestaka->node;
  299.         tmsg->from->net=bestaka->net;
  300.         tmsg->from->zone=bestaka->zone;
  301.         tmsg->from->domain=xstrcpy(bestaka->domain);
  302.     }
  303.  
  304.     if (fbuf) free(fbuf); fbuf=NULL;
  305.  
  306.     p=hdr("Subject",msg);
  307.     if (p)
  308.     {
  309.         while (isspace(*p)) p++;
  310.         tmsg->subj=xstrcpy(p);
  311.         if (*(p=tmsg->subj+strlen(tmsg->subj)-1) == '\n') *p='\0';
  312.         if (strlen(tmsg->subj) > MAXSUBJ) tmsg->subj[MAXSUBJ]='\0';
  313.     }
  314.     else tmsg->subj=xstrcpy(" ");
  315.  
  316.     debug(3,"SUBJ: \"%s\"",tmsg->subj);
  317.  
  318.     if ((p=hdr("X-FTN-FLAGS",msg))) setflags(tmsg,p);
  319.     if (hdr("Return-Receipt-To",msg)) tmsg->flags |= RRQ;
  320.     if (!newsmode)
  321.     {
  322.         tmsg->flags |= PVT;
  323.         tmsg->flags |= K_S;
  324.     }
  325.  
  326.     tmsg->msgid=ftnmsgid(hdr("Message-ID",msg));
  327.  
  328.     if ((p=hdr("In-Reply-To",msg)) == NULL)
  329.     {
  330.         p=hdr("References",msg);
  331.         if (p)
  332.         {
  333.             for (r=p+strlen(p); (*r != ' ') && (r >= p); r--);
  334.             p=r;
  335.         }
  336.     }
  337.     if (p) tmsg->reply=ftnmsgid(p);
  338.  
  339.     if ((p=hdr("Date",msg))) 
  340.         tmsg->date=ftndate(parsedate(p,NULL));
  341.     else tmsg->date=ftndate(time((time_t *)NULL));
  342.  
  343.     debug(3,"DATE: %s, MSGID: %s, REPLY: %s",
  344.         tmsg->date,tmsg->msgid,tmsg->reply);
  345.  
  346.     if ((p=hdr("Organization",msg)))
  347.     {
  348.         while (isspace(*p)) p++;
  349.         tmsg->origin=xstrcpy(p);
  350.         if (*(p=tmsg->origin+strlen(tmsg->origin)-1) == '\n') *p='\0';
  351.     }
  352.  
  353.     debug(3,"ORIGIN: %s",tmsg->origin);
  354.  
  355.     return tmsg;
  356. }
  357.